contextualiza la idea del seminario, entrega una idea general de la temática, de lo que se sabe y sobre todo de lo que no se sabe y queréis abordar en vuestro trabajo.
El suicidio es un fenómeno ocmplejo que constituye un importante problema de salud pública en España y en el mundo. Aunque se dispone de información general sobre la mortalidad por suicidio, la evidencia científica revela diferencias significativas según el sexo, la edad y el territorio.
En este seminario, nos proponemos comparar el suicidio utilizando distintos conjuntos de datos (sexo, edad y territorio) para explorar las diferencias y analizar a que se deben.
Describir la distribución del suicidio por sexo en España.
Analizar las diferencias entre provincias.
Estudiar la influencia del grupo de edad en la cantidad de suicidios.
Unificar los datos CSV y JSON para obtener una vista más completa.
(Opcional) Explorar si existe relación entre grupos de edad + provincias + sexo.
Para poder utilizar nuestros conjuntos de datos es necesario importar las siguientes librerias y paquetes:
# Datos con formato .csv:
library(readr)
#Datos con formato .json:
library(tidyverse)
library(rjson)
library(jsonlite)
library(tidyjson)
#Visualizacion resultados:
library(DT)
library(ggplot2)
library(gifski)
library(gganimate)
library(plotly)
library(dplyr)
library(mapSpain)
library(knitr) # librería para tablas
Una vez cargadas las librerias importamos los datos
Para este trabajo se han utilizado dos conjuntos de datos procedentes del Instituto Nacional de Estadísitca (INE), a través de sus estadísticas oficiales sobre defunciones según causa de muerte. Ambas fuentes se han descargado directamente desde la herramienta de consulta del INE y contienen información actualizada y validada por el organismo.
En resumen, el CSV ofrece tasas por provincia, sexo y año, mientras que el JSON proporciona números absolutos por edad y sexo a nivel nacional. Esta combinación permite un análisis estadístico completo tanto a nivel territorial como demográfico.
En algunos de nuestros archivos csv, es necesario especificar el tipo de codificación que tienen, para que R pueda leer correctamente los caracteres especiales como tildes o ñ. En nuestro caso utilizan la codificacion ISO 8859-1 que corresponde con el alfabeto español??? :
# Para conocer el tipo de codificación:
encoding <- guess_encoding("INPUT/DATA/provincias_sexo.csv")
print(encoding)
## # A tibble: 4 × 2
## encoding confidence
## <chr> <dbl>
## 1 UTF-8 1
## 2 Shift_JIS 1
## 3 windows-1252 0.45
## 4 windows-1250 0.21
provincias <- read_delim("INPUT/DATA/provincias_sexo.csv",
delim = ";", trim_ws = TRUE,
locale = locale(encoding = "ISO-8859-1"),
# FORZAMOS QUE TODO SE LEA COMO TEXTO AL PRINCIPIO
col_types = cols(.default = "c"))
head(provincias)
## # A tibble: 6 × 4
## Provincias Sexo Periodo Total
## <chr> <chr> <chr> <chr>
## 1 Nacional Total 2023 8,512
## 2 Nacional Total 2022 8,846
## 3 Nacional Total 2021 8,45
## 4 Nacional Hombres 2023 12,846
## 5 Nacional Hombres 2022 13,343
## 6 Nacional Hombres 2021 12,833
# Ruta al archivo JSON
ruta_json <- "INPUT/DATA/Suicidio_Edad-Sexo.json"
# Importar JSON y convertir a dataframe
suicidios_json <- fromJSON(ruta_json)
#suicidios_json <- as.data.frame(suicidios_json)
# Mostrar las primeras filas
head(suicidios_json)
## Nombre
## 1 Todas las edades, Ambos sexos
## 2 Todas las edades, Hombres
## 3 Todas las edades, Mujeres
## 4 Menores de 15 años, Ambos sexos
## 5 Menores de 15 años, Hombres
## 6 Menores de 15 años, Mujeres
## MetaData Data
## 1 edad, sexo, Todas las edades, Ambos sexos, todaslasedades, ambossexos 4227
## 2 edad, sexo, Todas las edades, Hombres, todaslasedades, hombres 3126
## 3 edad, sexo, Todas las edades, Mujeres, todaslasedades, mujeres 1101
## 4 edad, sexo, Menores de 15 años, Ambos sexos, menoresde15anos, ambossexos 12
## 5 edad, sexo, Menores de 15 años, Hombres, menoresde15anos, hombres 9
## 6 edad, sexo, Menores de 15 años, Mujeres, menoresde15anos, mujeres 3
Los datos han sido filtrados y preparados para asegurar la coherencia entre las fuentes. Se eliminaron los totales generales en sexo para poder comparar hombres y mujeres. Se normalizó el nombre de las provincias para ….noseq y se separó el json en edad, sexo y valor para noseqqq
provincias <- provincias %>%
mutate(
# Ahora 'Total' es texto seguro (ej: "13,34").
# Cambiamos la coma por punto.
Total = as.numeric(gsub(",", ".", Total)),
# Aprovechamos para convertir 'Periodo' a número también
Periodo = as.numeric(Periodo)
)
# Ahora creamos el dataframe filtrado
Suicidios_CSV_filtrado <- provincias %>%
filter(Sexo != "Total",
Provincias != "Nacional")
# Verificamos: Total debe ser <dbl> (número real con decimales)
head(Suicidios_CSV_filtrado)
## # A tibble: 6 × 4
## Provincias Sexo Periodo Total
## <chr> <chr> <dbl> <dbl>
## 1 "01 Araba/Ã\u0081lava" Hombres 2023 10.8
## 2 "01 Araba/Ã\u0081lava" Hombres 2022 13.9
## 3 "01 Araba/Ã\u0081lava" Hombres 2021 11.0
## 4 "01 Araba/Ã\u0081lava" Mujeres 2023 4.09
## 5 "01 Araba/Ã\u0081lava" Mujeres 2022 4.70
## 6 "01 Araba/Ã\u0081lava" Mujeres 2021 5.32
# Crear el dataframe filtrado para el gráfico
# (Usa el dataframe 'provincias' que ya cargaste y mutaste)
Suicidios_CSV_filtrado <- provincias %>%
filter(Sexo != "Total",
Provincias != "Nacional")
# Ver el resultado (opcional)
head(Suicidios_CSV_filtrado)
## # A tibble: 6 × 4
## Provincias Sexo Periodo Total
## <chr> <chr> <dbl> <dbl>
## 1 "01 Araba/Ã\u0081lava" Hombres 2023 10.8
## 2 "01 Araba/Ã\u0081lava" Hombres 2022 13.9
## 3 "01 Araba/Ã\u0081lava" Hombres 2021 11.0
## 4 "01 Araba/Ã\u0081lava" Mujeres 2023 4.09
## 5 "01 Araba/Ã\u0081lava" Mujeres 2022 4.70
## 6 "01 Araba/Ã\u0081lava" Mujeres 2021 5.32
Para así comparar hombres vs mujeres (entonces yo quitaría lo de cambiar el separador decimal xq si quitamos el total no nos hace falta camibar lo de . por , nose)
library(dplyr)
library(purrr)
library(tidyr)
# ===============================
# 1. Provincias: eliminar "Total" en Sexo
# ===============================
provincias_filtrado <- provincias %>%
filter(Sexo != "Total")
# Revisar resultado
head(provincias_filtrado)
## # A tibble: 6 × 4
## Provincias Sexo Periodo Total
## <chr> <chr> <dbl> <dbl>
## 1 Nacional Hombres 2023 12.8
## 2 Nacional Hombres 2022 13.3
## 3 Nacional Hombres 2021 12.8
## 4 Nacional Mujeres 2023 4.35
## 5 Nacional Mujeres 2022 4.52
## 6 Nacional Mujeres 2021 4.23
Extraer: - Lista de edades - Lista de sexos - Valor
# Chunk CORREGIDO para: ### El JSON:separar edad y sexo
# (Asegúrate de tener 'library(tidyverse)' y 'library(jsonlite)' en tu chunk de paquetes)
# Este código usa un método más robusto para "aplanar" el JSON
# y evitar que se creen valores NA.
Suicidios_Edad <- as_tibble(suicidios_json) %>%
# 1. Extraer el 'Valor' de la sub-lista 'Data'
# (map_dbl toma cada elemento de 'Data' y extrae el primer 'Valor')
mutate(Valor = map_dbl(Data, ~ .x$Valor[1])) %>%
# 2. Guardar el 'Nombre' original (ej. "De 15 a 29 años, Hombres")
# como un ID único para agrupar las filas.
select(ID_Fila = Nombre, Valor, MetaData) %>%
# 3. Desanidar 'MetaData', que creará dos filas por cada ID_Fila
# (una para 'edad' y otra para 'sexo')
unnest(MetaData) %>%
# 4. Seleccionar solo las columnas que necesitamos para pivotar
select(ID_Fila, Valor, T3_Variable, Nombre) %>%
# 5. Pivotar usando el ID_Fila. Esto asegura que la 'edad' y el 'sexo'
# del mismo ID_Fila terminen en la misma fila, junto a su 'Valor'.
pivot_wider(names_from = T3_Variable, values_from = Nombre) %>%
# 6. Filtrar los totales (como antes)
filter(sexo != "Ambos sexos",
edad != "Todas las edades") %>%
# 7. (Opcional) Quitar la columna de ID, ya no la necesitamos
select(edad, sexo, Valor)
# Ver el resultado (opcional)
# Esta tabla ya no debería tener NAs en 'edad' o 'sexo'
print("Datos JSON (versión final) listos:")
## [1] "Datos JSON (versión final) listos:"
head(Suicidios_Edad)
## # A tibble: 6 × 3
## edad sexo Valor
## <chr> <chr> <dbl>
## 1 Menores de 15 años Hombres 9
## 2 Menores de 15 años Mujeres 3
## 3 De 15 a 29 años Hombres 224
## 4 De 15 a 29 años Mujeres 117
## 5 De 30 a 39 años Hombres 336
## 6 De 30 a 39 años Mujeres 100
Aquí vienen los gráficos
Usando los datos del JSON, a partir de la tabla Suicidios_Edad (con las columnas sexo, edad y valor), agrupamos los datos que tengan el mismo valor en la columna sexo (hombres/mujeres) y para cada grupo hemos calculado la suma total de la columna valor. Como resultado obtenemos un nuevo tibble de 2 filas (una por sexo), con las columnas sexo y total. Con el nuevo tibble creamos un gráfico de barras.
# Sumar los valores por sexo
suicidio_sexo_nacional <- Suicidios_Edad %>%
group_by(sexo) %>%
summarise(Total = sum(Valor, na.rm = TRUE))
# Revisar tabla
print(suicidio_sexo_nacional)
## # A tibble: 2 × 2
## sexo Total
## <chr> <dbl>
## 1 Hombres 3126
## 2 Mujeres 1101
# #GRAFICO DE BARRAS (suicidios por sexo a nivel nacional)
ggplot(suicidio_sexo_nacional, aes(x = sexo, y = Total, fill = sexo)) +
geom_bar(stat = "identity") +
labs(
title = "Suicidios por sexo a nivel nacional",
x = "Sexo",
y = "Número total de suicidios"
) +
scale_fill_manual(values = c("Hombres" = "#1f77b4", "Mujeres" = "#ff7f0e")) +
theme_minimal()
Podemos representar los datos anteriores en otros tipos de gráfico, por ejemplo el gráfico circular. Igual que en el anterior, agrupamos los datos que tengan el mismo valor en la columna sexo, y para cada grupo calculamos la suma total de la columna valor, obteniendo como resultado un nuevo tibble para llevar a cabo el gráfico circular.
# 1. Filtrar datos a nivel nacional (ya que JSON tiene solo sexo y edad, sumamos por sexo)
nacional_sexo <- Suicidios_Edad %>%
group_by(sexo) %>%
summarise(Total = sum(Valor))
print(nacional_sexo) #visualizamos el nuevo tibble
## # A tibble: 2 × 2
## sexo Total
## <chr> <dbl>
## 1 Hombres 3126
## 2 Mujeres 1101
#GRÁFICO CIRCULAR
ggplot(nacional_sexo, aes(x = "", y = Total, fill = sexo)) +
geom_bar(stat = "identity", width = 1) + # barra para convertir a circular
coord_polar(theta = "y") + # transforma a circular
labs(title = "Suicidios por sexo a nivel nacional") +
theme_minimal() +
theme(axis.title = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank()) +
scale_fill_manual(values = c("Hombres" = "steelblue", "Mujeres" = "pink"))
INTERPRETACIÓN El gráfico de barras compara el total de suicidios entre hombres y mujeres, muestra que los hombreses presentan un mayor número de suicidios. El gráfico circular representa la misma información, pero en proporciones del total, muestra que los hombres representan aproximadamente el 75% de los suicidios a nivel nacional, mientras que las mujeres el 25%.
En conclusión, los análisis del total de suicidios según el sexo muestra una diferencia clara entre hombres y mujeres. En España, el número total de suicidios es significativamente mayor en hombres que en mujeres, lo cual coincide con las estadísitcas nacionales e internacionales, donde los hombres presentan tasas de suicidio más elevadas a pesar de que las mujeres registran más intentos no letales. Este patrón puede estar asociado a factores socioculturales, diferencias en métodos utilizados, menor búsqueda de ayuda por parte de los hombres o barreras sociales relaccionadas con la salud mental.
# Carga la librería plotly (si no está ya cargada)
library(plotly)
# 1. CREA el gráfico de ggplot (como antes, pero lo guardamos en una variable 'p')
# (Añado 'ncol=6' para que plotly tenga un layout inicial ordenado)
p <- ggplot(Suicidios_CSV_filtrado, aes(x = Sexo, y = Total, color = Sexo)) +
geom_point() +
facet_wrap(~Provincias, ncol = 6) + # 6 columnas de mini-gráficos
theme(
axis.text.x = element_text(angle = 0),
strip.text = element_text(size = 7)
)
# 2. CONVIÉRTELO en interactivo con un solo comando
# Ahora podrás hacer zoom y ver los detalles
ggplotly(p)
# Gráfico 4.4.3: Suicidio por edad (CORREGIDO)
# La corrección está en aes(fill = sexo) -> (todo en minúscula)
ggplot(Suicidios_Edad, aes(x = edad, y = Valor, fill = sexo)) +
geom_bar(stat = "identity", position = "dodge") +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1))
Como el CSV tiene los datos en referencia a 100.000 habitantes, vamos a hacer lo mismo con el JSON y así podremos compararlos.
1. Creacción de la tabla de referencia En este paso,creamos una tabla de referencia de población, para ello usamos los datos oficiales totales de hombres y mujeres encontrados en INE. En esta nueva tabla la columna sexo será clave para unirla posteriormente con nuestros datos.
poblacion_ref <- data.frame(
sexo = c("Hombres", "Mujeres"),
Poblacion_Nacional = c(23265381, 24210039)
)
print(poblacion_ref)
## sexo Poblacion_Nacional
## 1 Hombres 23265381
## 2 Mujeres 24210039
2. Unión y cálculo de tasas
Unimos la nueva tabla creada con la población de referencia al JSON y calculamos las tasas. Left_join: Esta función incorpora los datos de la tabla calculada anteriormente (poblacion_ref) a nuestra tabla principal (suicidios_edad). Busca coindidencias en la columna comun ‘sexo’ y añade la columna ‘Poblacion_Nacional’ a cada fila correspondiente. mutate(Tasa_aportacion…): crea una nueva columna calculada que nos da la tasa específica de ese grupo de edad. Nos dice cuantos suicidios aporta ese rango de edad para cada 100.000 habitantes de ese sexo.
# Partimos de la tabla 'Suicidios_Edad' que creamos al procesar el JSON
Suicidios_Con_Tasas <- Suicidios_Edad %>%
# Unimos con nuestra tabla de población manual mediante un left_join
left_join(poblacion_ref, by = "sexo") %>%
# Calculamos la tasa por 100.000 habitantes
mutate(Tasa_Aportacion = (Valor / Poblacion_Nacional) * 100000)
# Visualizamos la tabla resultante
head(Suicidios_Con_Tasas)
## # A tibble: 6 × 5
## edad sexo Valor Poblacion_Nacional Tasa_Aportacion
## <chr> <chr> <dbl> <dbl> <dbl>
## 1 Menores de 15 años Hombres 9 23265381 0.0387
## 2 Menores de 15 años Mujeres 3 24210039 0.0124
## 3 De 15 a 29 años Hombres 224 23265381 0.963
## 4 De 15 a 29 años Mujeres 117 24210039 0.483
## 5 De 30 a 39 años Hombres 336 23265381 1.44
## 6 De 30 a 39 años Mujeres 100 24210039 0.413
3. Gráfico comparativo
Generamos un gráfico de barras para visualizar las tasas calculadas para cada grupo de edad, confirmando que se corresponde con la misma forma del anterior gráfico, pero esta vez, calculado con la tasa por cada 100.000 habitantes del mismo sexo.
#En el eje X ponemos los grupos de edad y en el eje Y la tasa calculada.
#Con 'dodge', las barras de hombres y mujeres se colocan una al lado de otra, evitando solapamientos.
ggplot(Suicidios_Con_Tasas, aes(x = edad, y = Tasa_Aportacion, fill = sexo)) +
geom_bar(stat = "identity", position = "dodge") +
scale_fill_manual(values = c("Hombres" = "#1f77b4", "Mujeres" = "#ff7f0e")) +
labs(
title = "Tasa de suicidios por grupo de edad (2022)",
subtitle = "Tasa por cada 100.000 habitantes del mismo sexo",
y = "Tasa (x 100.000 hab.)",
x = "Grupo de Edad"
) +
theme_minimal() +
#rotamos 45 grados las etiquetas del eje X porque los nombres de los grupos de edad son largos y si no se solaparían.
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
legend.position = "top"
)
4. Validación (unión)
Este es el paso de control de calidad para demostrar que las fuentes (CSV y JSON) son coherentes entre sí. - validacion_json: Agrupamos los datos del JSON por sexo y sumamos todas las tasas parciales de los grupos de edad. La suma de las partes debe dar el total nacional. - validacion_csv: Filtramos para quedarnos solo con el dato nacional de 2022 (ya que el JSON se corresponde también con dicho año) - left_join: Une los dos resultados en una sola tabla (comparativa_fuentes). Si los números coindicen, hemos demostrado que la integración de los datos es correcta.
# 1. Calculamos la tasa total del JSON
validacion_json <- Suicidios_Con_Tasas %>%
group_by(sexo) %>%
summarise(Tasa_Calculada_JSON = sum(Tasa_Aportacion))
# 2. Sacamos la tasa del CSV (¡Ahora ya está limpia!)
validacion_csv <- provincias %>%
filter(Provincias == "Nacional", Periodo == 2022, Sexo != "Total") %>%
select(Sexo, Tasa_Oficial_CSV = Total)
# 3. Unimos ambas tablas
comparativa_fuentes <- left_join(validacion_json, validacion_csv, by = c("sexo" = "Sexo"))
print(comparativa_fuentes)
## # A tibble: 2 × 3
## sexo Tasa_Calculada_JSON Tasa_Oficial_CSV
## <chr> <dbl> <dbl>
## 1 Hombres 13.4 13.3
## 2 Mujeres 4.55 4.52
# 4. Para poner la tabla bonita
#library(knitr)
#kable(comparativa_fuentes,
# col.names = c("Sexo", "Tasa JSON (Calculada)", "Tasa CSV (Oficial)"),
# digits = 2,
# caption = "Validación de tasas (2022)")
5- Gráfico comparando CSV y JSON
Representamos gráficamente la validación anterior. El siguiente gráfico nos permite confirmar visualmente la cosistencia entre nuestras dos fuentes de datos. Si las barras de cada par tienen la misma altura, significa que la integración de los datos absolutos del JSON con las tasas oficiales del CSV se corresponden.
# 1. Preparamos los datos
# A) Datos del JSON (Calculados)
datos_json <- comparativa_fuentes %>%
select(sexo, Tasa = Tasa_Calculada_JSON) %>%
mutate(
Fuente = "Cálculo propio (JSON)",
Tasa = as.numeric(Tasa) # Aseguramos que sea número
)
# B) Datos del CSV (Oficiales)
datos_csv <- comparativa_fuentes %>%
select(sexo, Tasa = Tasa_Oficial_CSV) %>%
mutate(
Fuente = "Dato Oficial (CSV)",
# Pasamos a texto -> cambiamos coma por punto -> pasamos a número
Tasa = as.numeric(gsub(",", ".", as.character(Tasa)))
)
# C) Unimos las dos tablas (ahora sí, ambas son numéricas)
datos_grafico <- bind_rows(datos_json, datos_csv)
# 2. Creamos el gráfico de barras agrupadas
ggplot(datos_grafico, aes(x = sexo, y = Tasa, fill = Fuente)) +
geom_bar(stat = "identity", position = "dodge", width = 0.7) +
geom_text(aes(label = round(Tasa, 2)),
position = position_dodge(width = 0.7),
vjust = -0.5, size = 3.5) +
scale_fill_manual(values = c("Cálculo propio (JSON)" = "#2ca02c", "Dato Oficial (CSV)" = "#7f7f7f")) +
labs(
title = "Comparativa de consistencia entre fuentes de datos",
subtitle = "Tasa de suicidio por sexo (Año 2022)",
y = "Tasa (por 100.000 hab.)",
x = "Sexo",
fill = "Fuente de datos"
) +
theme_minimal() +
theme(legend.position = "top")
INTERPRETACIÓN Y VALIZACIÓN DE RESULTADOS
El gráfico de barras agrupadas compara las tasas de suicidio por sexo obtenidas de dos formas distintas: - Dato oficial (CSV): La tasa publicada directamente por el INE - Cálculo propio (JSON): La tasa que hemos calculado nosotros mismos sumando los suicidios absolutos por edad del JSON y dividiéndolos por la población oficial de España.
Como se puede observar, las barras verdes y las grises son prácticamente idénticas tanto para hombres como para mujeres. Esta coincidencia nos permite afirmar: - La validación metodológica, nuestro procedimiento para unir las bases de datos y calcular las tasas por edad ha sido correcto. - La consistencia de los datos, confirmarmos que ambas fuentes de datos del INE son coherentes entre sí, asegurando que los análisis detallados que hemos realizado anteriormente son representativos y fiables.
6. Análisis brecha de género
Para finalizar, calculamos cuántos hombres se suicidan por cada mujer en cada grupo de edad. Este gráfico responde a la pregunta: “¿Por cada mujer que se suicida en este grupo de edad, cuántos hombres lo hacen?. Un valor de 1 significa igualdad, un valor de 3 significa que hay 3 veces más suicidios masculinos en dicho grupo.
# 1. Preparamos los datos: Pivotamos para tener Hombres y Mujeres en columnas
brecha_genero <- Suicidios_Con_Tasas %>%
select(edad, sexo, Tasa_Aportacion) %>%
pivot_wider(names_from = sexo, values_from = Tasa_Aportacion) %>%
# Calculamos el Ratio (Cuántos hombres por cada mujer)
mutate(Ratio_H_M = Hombres / Mujeres)
# 2. Gráfico de Piruleta (Lollipop Chart) para visualizar la diferencia
ggplot(brecha_genero, aes(x = edad, y = Ratio_H_M)) +
# Línea vertical desde 0 hasta el punto
geom_segment(aes(x = edad, xend = edad, y = 0, yend = Ratio_H_M), color = "grey") +
# Punto en el valor del ratio
geom_point(size = 4, color = "#1f77b4") +
# Texto con el valor exacto
geom_text(aes(label = round(Ratio_H_M, 1)), vjust = -0.8, size = 3) +
labs(
title = "Brecha de género en el suicidio por edad",
subtitle = "Ratio de masculinidad: Número de suicidios masculinos por cada suicidio femenino",
y = "Ratio (Hombres / Mujeres)",
x = "Grupo de Edad"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
INTERPRETACIÓN
Este análisis revela que el suicidio es un fenómeno muy masculinizado en todos los grupos de edad (todos los ratios son superiores a 1). Sin embargo, observamos que la brecha no es constante, se dispara en el grupo de 85 a 89 años, donde hay casi 5 hombres por cada mujer.
Tras el análisis comparativo de las tasas de suicidio en España utilizando datos oficiales del INE, podemos extraer las siguientes conclsiones princiaples: - una linea por grafico ………….
Este análisis de datos destaca la necesidad de estrategías de prevención dirigidas específicamente a los grupos de mayor riesgo identificados: hombres y….